package com.zsj.springbootmq.service;

import com.rabbitmq.client.Channel;
import com.zsj.springbootmq.pojo.EmailInfo;
import com.zsj.springbootmq.pojo.LogInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

/**
 * @author https://gitee.com/zhengshengjun
 * @date 2023/11/17.
 */
@Service
@Slf4j
@RabbitListener(queues = {"java-q1"})
public class RabbitMQListenerService {

    /**
     * 参数解析
     * 第一个参数是他原来的的原生消息体
     * 第二个参数是我们发送的消息实体到底是什么类型的
     * 1.Message message 原生消息体
     * 2.T<发送的消息类型> object 我们自己发送的消息类型
     * 3.Channel channel :当前传输数据的通道
     */

//    @RabbitHandler
//    public void receiveMessage(Message message,
//                               LogInfo content,
//                               Channel channel) {
//        //消息体对象
//        byte[] body = message.getBody();
//        //消息头属性
//        MessageProperties messageProperties = message.getMessageProperties();
//        log.info("接收到的消息为{} 自定义类型信息为{},", message, content);
//    }


    /**
     * RabbitHandler 在类上声明我们要接收的队列名称
     * 这个注解会起到一个重载的作用 自动判断是哪一个实体然后接收消息
     */
    @RabbitHandler
    public void receiveMessage(Message message,
                               EmailInfo emailInfo,
                               Channel channel) throws Exception {
        //channel自增deliveryTag 按顺序自增
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        log.info("receiveMessage接收到的消息为{},tag is{},", emailInfo, deliveryTag);
        //非批量应答
        channel.basicAck(deliveryTag, false);//非批量模式确认
        //拒绝应答 这两个都是拒绝的方法 nack多了一个是否批量的选项参数
        //long deliveryTag, boolean multiple, boolean requeue
        //其中这个requeue（布尔）是一个重新入队的操作 false将会将其直接丢弃
        channel.basicNack(deliveryTag,false,false);
        //long deliveryTag, boolean requeue
        channel.basicReject(deliveryTag,false);
    }

    @RabbitHandler
    public void receiveMessage2(Message message, LogInfo logInfo, Channel channel) throws Exception {
        log.info("receiveMessage2接收到的消息为{},", logInfo);
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }
}
